我一直觉得代码会随着时间的久更新变动的快,但是思想这个东西是越经过时间越经典的一个东西。
如何获取一些好的思想呢?多看别人的代码 多去总结和思考 多交流 分享 面试 等等 都是获取一些好的想法的途径。
接下来进入正题:
如何来实现一个自己的NSNotificationCenter?由于我们看不到源码 所以也不知道苹果具体是怎么实现的。
但是大致肯定的是:系统的通知中心,就是用观察者模式实现的
NSNotificationCenter是一个单例模式,保存了所有注册的观察者
当有消息要发送,遍历观察者列表,给对应的观察者转发消息 。
具体代码实现请看我的github地址:
https://github.com/jiecoding/DIYNSNotificationCenter
下面的是简单回顾下系统的通知中心(高手可以直接跳过),对于有什么好的建议请及时提出来,谢谢!
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationSelector) name:@"notificationName" object:nil];
NSNotificationCenter消息通信机制介绍(KVO)
作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的.
注册通知:即要在什么地方接受消息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mytest:) name:@” mytest” object:nil];
参数介绍:
addObserver: 观察者,即在什么地方接收通知;
selector: 收到通知后调用何种方法;
name: 通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。
发送通知:调用观察者处的方法。
[[NSNotificationCenter defaultCenter] postNotificationName:@”mytest” object:searchFriendArray];
参数:
postNotificationName:通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。
object:传递的参数
注册方法的写法:
- (void) mytest:(NSNotification*) notification
{
id obj = [notification object];//获取到传递的对象
}
附:注册键盘升启关闭消息
//键盘升起 [[NSNotificationCenter……
简单的使用参照:http://my.oschina.net/gexun/blog/385799
上面简单看了下NSNotificationCenter的使用和简单构成原理。
然后接下来我们思考下,如果我们自己实现应该如何做?
第一步 先创建一个单例 ,然后写添加监听和 发送广播
- (DIYNotificationSingle )sharedManager
{
static DIYNotificationSingle ManagerInstance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
});ManagerInstance = [[self alloc] init];
return ManagerInstance;
}
(void)diyAddObserver:(id)observer selector:(SEL)aSelector name:(nullable NSString *)aName object:(nullable id)anObject
{Entity *entity = [[Entity alloc] init]; entity.observer = observer; entity.aSelector = aSelector; entity.notificationName = aName; if(!_observers) { _observers = [[NSMutableArray alloc] init]; } [_observers addObject:entity];
}
(void)diyPostNotificationName:(NSString )aName object:(nullable id)anObject
{
for (Entity observer in _observers)
{[observer.observer performSelector:observer.aSelector withObject:nil];
}
}
(void)diyRemoveObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject
{
for (int i = 0; i < _observers.count ; i++){Entity *observerE = [_observers objectAtIndex:i]; if([observerE.observer isEqual:observer]){ [_observers removeObjectAtIndex:i]; }
}
NSLog(@”remove:%@”,_observers);
}
关于消息处理方法runtime等 可以预览下 http://www.cnblogs.com/buro79xxd/archive/2012/04/10/2440074.html